聊聊jdbc socketTimeout的设置 您所在的位置:网站首页 java connect time out 聊聊jdbc socketTimeout的设置

聊聊jdbc socketTimeout的设置

2024-07-09 16:42| 来源: 网络整理| 查看: 265

本文主要介绍下jdbc的socket timeout的设置

jdbc timeout类别

主要有如下几个类别

transaction timeout 设置的是一个事务的执行时间,里头可能包含多个statementstatement timeout(也相当于result set fetch timeout) 设置的是一个statement的执行超时时间,即driver等待statement执行完成,接收到数据的超时时间(注意statement的timeout不是整个查询的timeout,只是statement执行完成并拉取fetchSize数据返回的超时,之后resultSet的next在必要的时候还会触发fetch数据,每次fetch的超时时间是单独算的,默认也是以statement设置的timeout为准)jdbc socket timeout 设置的是jdbc I/O socket read and write operations的超时时间,防止因网络问题或数据库问题,导致driver一直阻塞等待。(建议比statement timeout的时间长)os socket timeout 这个是操作系统级别的socket设置(如果jdbc socket timeout没有设置,而os级别的socket timeout有设置,则使用系统的socket timeout值)。

上面的不同级别的timeout越往下优先级越高,也就是说如果下面的配置比上面的配置值小的话,则会优先触发timeout,那么相当于上面的配置值就”失效”了。

jdbc socket timeout

这个不同数据的jdbc driver实现不一样

mysql代码语言:javascript复制jdbc:mysql://localhost:3306/ag_admin?useUnicode=true;characterEncoding=UTF8&connectTimeout=60000&socketTimeout=60000

通过url参数传递即可

pg代码语言:javascript复制jdbc:postgresql://localhost/test?user=fred&password=secret&&connectTimeout=60&socketTimeout=60

pg也是通过url传递,不过它的单位与mysql不同,mysql是毫秒,而pg是秒

oracle

oracle需要通过oracle.jdbc.ReadTimeout参数来设置,连接超时参数是oracle.net.CONNECT_TIMEOUT

通过properties设置 Class.forName("oracle.jdbc.driver.OracleDriver"); Properties props = new Properties() ; props.put( "user" , "test_schema") ; props.put( "password" , "pwd") ; props.put( "oracle.net.CONNECT_TIMEOUT" , "10000000") ; props.put( "oracle.jdbc.ReadTimeout" , "2000" ) ; Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@10.0.1.9:1521:orcl" , props ) ;通过环境变量设置 String readTimeout = "10000"; // ms System.setProperty("oracle.jdbc.ReadTimeout", readTimeout); Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection(jdbcUrl, user, pwd); 注意需要在connection连接之前设置环境变量tomcat jdbc pool 一般我们不直接使用jdbc connection,而是使用连接池。由于tomcat jdbc pool是springboot默认使用的数据库连接池,这里就讲述一下如何在tomcat jdbc pool下设置。 spring.datasource.tomcat.connectionProperties=oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000 注意,这里是分号分隔,单位是毫秒,这里可以根据各自的情况配置前缀(tomcat jdbc连接池的话,默认是spring.datasource.tomcat),可以自定义,比如 @Bean @Qualifier("writeDataSource") @ConfigurationProperties(prefix = "spring.datasource.write") public DataSource writeDataSource() { return DataSourceBuilder.create().build(); } 假设你这里是自定义了prefix为spring.datasource.write,那么上述配置就变为 spring.datasource.write.connectionProperties=oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000 oracle.jdbc.ReadTimeout如果没有设置的话,driver里头默认是0oracle.jdbc.ReadTimeout

driver内部将该值设置到oracle.net.READ_TIMEOUT变量上

oracle.net.nt.TcpNTAdapter代码语言:javascript复制 @Override public void setReadTimeoutIfRequired(final Properties properties) throws IOException, NetException { String s = ((Hashtable)properties).get("oracle.net.READ_TIMEOUT"); if (s == null) { s = "0"; } this.setOption(3, s); } public void setOption(int var1, Object var2) throws IOException, NetException { String var3; switch(var1) { case 0: var3 = (String)var2; this.socket.setTcpNoDelay(var3.equals("YES")); break; case 1: var3 = (String)var2; if(var3.equals("YES")) { this.socket.setKeepAlive(true); } case 2: default: break; case 3: this.sockTimeout = Integer.parseInt((String)var2); this.socket.setSoTimeout(this.sockTimeout); } }

可用看到最后设置的是socket的soTimeout

实例代码语言:javascript复制 @Test public void testReadTimeout() throws SQLException { Connection connection = dataSource.getConnection(); String sql = "select * from demo_table"; PreparedStatement pstmt; try { pstmt = (PreparedStatement)connection.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); int col = rs.getMetaData().getColumnCount(); System.out.println("============================"); while (rs.next()) { for (int i = 1; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有